Step Functionsを用いてS3にアップロードされたファイルのメタデータをDynamoDBに保存する構成を構築してみた

Step Functionsを用いてS3にアップロードされたファイルのメタデータをDynamoDBに保存する構成を構築してみた

Clock Icon2025.01.10

はじめに

かつまたです。Step Functionsを利用してS3バケットにファイルがアップロードされた際にDynamoDBテーブルに該当オブジェクトのファイルや処置実行日時を保存する構成を構築したので手順をご紹介します。

やってみた

前提

以下のポリシーを含むLambda用実行ロールを作成します。

  • AWSLambdaBasicExecutionRole
  • AmazonS3ReadOnlyAccess
  • AmazonDynamoDBFullAccess

以下のポリシーを含むStep Function用実行ロールを作成します。

  • AWSLambdaRole

S3バケット作成

1.マネジメントコンソール上から任意のS3バケットを作成します。
スクリーンショット 2025-01-10 16.26.18.png

2.作成したS3バケットの「プロパティ」→「イベント通知」→「Amazon Eventbridge」から「このバケット内のすべてのイベントについて Amazon EventBridge に通知を送信する」をオンにします。
スクリーンショット 2025-01-10 16.01.57.png
S3、Eventbridge許可.png

DynamoDBテーブル作成

作成したS3オブジェクトのメタデータを保存するDynamoDBテーブルを作成します。
1.「DynamoDB」から「テーブルの作成」を選択しし、テーブル名(例:FileProcessingResults)、パーティションキー(fileId、文字列型)を設定し、テーブルを作成します。
スクリーンショット 2025-01-10 16.31.27.png

Lambda関数作成

取得したS3オブジェクト情報を使用して、ファイル名、処理日時、ステータスを含むJSONオブジェクトを生成するLambda関数と、上記の関数から受けとった処理結果をDynamoDBに保存する関数を作成します。
1.処理関数(関数名:ProcessFile)を作成します。「Lambda」から「関数の選択」を選択し、関数名(ProcessFile)、ランタイム(Python 3.9)、作成したLambda用実行ロールを設定し、関数を作成します。
ProcessFile作成.png

2.作成した関数の「コード」に以下のコードを記述し、デプロイします。

python
import json
import boto3
from datetime import datetime

def lambda_handler(event, context):
    # 入力データを取得
    file_name = event['detail']['object']['key']

    # 処理結果を作成
    result = {
        'fileId': file_name,
        'processedAt': datetime.now().isoformat(),
        'status': 'PROCESSED'
    }

    return result

Processコード.png

3.同様にDynamoDB保存用関数(関数名:SaveResult)を作成します。関数名(SaveResult)、ランタイム(Python 3.9)、作成したLambda用実行ロールを設定します。
Saveresult作成.png

4.「コード」に以下のコードを記述し、デプロイします。

python
import json
import boto3

def lambda_handler(event, context):
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('FileProcessingResults')
    table.put_item(Item=event)
    return {
        'statusCode': 200,
        'body': 'Data saved successfully'
    }

Saveresultコード.png

Step Functionsステートマシン作成

1.「ステートマシンの作成」をクリックし、「コード」を選択し、定義を行います。
定義に以下の JSON を記述します。

json
{
  "Comment": "File processing workflow",
  "StartAt": "ProcessFile",
  "States": {
    "ProcessFile": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "ProcessFile",
        "Payload.$": "$"
      },
      "Next": "SaveResult"
    },
    "SaveResult": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "SaveResult",
        "Payload.$": "$.Payload"
      },
      "End": true
    }
  }
}

StefFucntionコード.png

2.「設定」から「ステートマシーン名」を記入し、作成したStep Functions用実行ロールを選択します。
StepFunction設定.png

Eventbridgeルール作成

S3へのオブジェクトアップロートをトリガーとし、Step Functionsステートマシンを起動させるEventbridgeルールを作成します。
1.「Eventbridge」→「ルール」から「ルールの作成」をクリックし、名前(S3FileUploadRule)を設定します。
Eventbridge作成1.png

2.イベントパターンにおいて「AWSのサービス」で「S3」を選択し、「イベントタイプ」で「S3イベント通知」を選択します。また「特定のイベント」から「Object Create」を選択し、「特定のバケットから」作成したS3バケット名を記入します。
Eventbridge作成、ターゲット.png

4.ターゲットで「Step Functionsステートマシン」を選択し、「実行ロールを「この特定のリソースについて新しいロールを作成」を選択します。
Eventbridge作成、ロール.png

動作確認

1.作成したバケットを選択し、「アップロード」をから適当なテストファイルをアップロードします。
ファイルアップロード.png

2.作成したステートマシンを選択し、実行履歴でアクションの成功を確認します。
StepFunction実行完了.png

3.「DynamoDB」で作成したテーブルを選択し、「テーブルアイテムの探索」から保存されたデータを確認します。
DynemoDB成功.png
DynemoDB成功2.png

おわりに

今回は、S3バケットにアップロードされたファイルをLambda関数で処理し、DynamoDBテーブルに保存するプロセスを実装しました。EventBridgeはS3バケットのイベントを検出し、Step Functionsのステートマシンをトリガーすることで、これらのLambda関数を連携させました。
この構成を利用することでS3にアップロードされた画像データをLambda関数で画像処理やOCR処理を行い、テキストデータを抽出させるといった構成にも発展可能だと感じました。
ご覧いただきありがとうございました。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.